/******************************************************************
 * 文件：TLink.c
 * 功能：实现TLink云平台的TCP连接相关函数
 * 日期：2018-04-11
 * 作者：zx
 * 版本：Ver.1.0 | 最初版本
 * 
 * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#include "stdio.h"
#include "string.h"
#include "TLink.h"
#include "NetWork.h"
#include "RELAY/Relay.h"
#include "DELAY/Delay.h"
extern u8 RXBuffer[RXBUFFER_LEN];
extern DeviceSta_Strcture device;
/**
 * 功能：连接TLink云平台
 * 参数：None
 * 返回值：非0表示连接成功,0表示失败
 */
u8 connectTlink(void)
{
    u8 sta = 0;

    sta = connectServer(TCP,TLINK_IP,TLINK_PORT);   //连接服务器

    if(sta!=0)
    {
        printf("\r\nTLinked TLink!");
        sendBuffertoServer(APP_ID);                 //发送注册序号
    }else 
    {
        printf("\r\nLink fail!");
    }
    

    return sta;
}

/**
 * 功能：发送设备状态(传感器数据以及继电器状态)
 * 参数：pdevsta 设备参数结构体指针
 * 返回值：None
 */
void sendDeviceStatus(DeviceSta_Strcture * pdevsta)
{
    static u8 m=0;
    char buffer[25] = {0};
    /* m用于在温度过高时只进一次 */
    if(device.Temperature >= 30 && device.Temperature!=255 && m==0)
    {
        Delay_ms(2000);
        if(device.Temperature >= 30 && device.Temperature!=255 && m==0)
            {
                m++;
                pdevsta->Beep = 1;//蜂鸣器低电平工作
                setRelay(Light,Light_ON);    //蜂鸣器低电平触发，高电平不工作
            }
    }
    else if(device.Temperature < 30 && device.Temperature!=255 && m!=0)
    {
        m=0;
        pdevsta->Beep = 0;//蜂鸣器高电平不工作
        setRelay(Light,Light_OFF);    //蜂鸣器低电平触发，高电平不工作
    }
    else
    {

    }
    
    /*格式化数据帧*/
    sprintf(buffer,"FM:%d,%d,%d,%d,%d.#",pdevsta->Humidity,pdevsta->Temperature,pdevsta->Lux,pdevsta->Relay1,pdevsta->Beep);
 
    /*发送数据到TLink服务器*/
    sendBuffertoServer(buffer);
}

/**
 * 功能：处理从服务器接收的控制数据
 * 参数：pdevsta 设备参数结构体指针
 * 返回值：None
 * 说明：该函数应该被串口空闲中断调用,已达到最佳实时性能
 */
void processDeviceStatus(DeviceSta_Strcture * pdevsta)
{
    u8 i = 0;

    /*掉线重连*/
    if((u8)strstr(RXBuffer,"CLOSE"))
    {
        printf("\r\nDisconnected!");
        connectTlink();
        memset(RXBuffer,0,RXBUFFER_LEN);
        return;
    }

    /*对应状态控制*/
    if((u8)strstr(RXBuffer,"RELAY1_ON"))
    {
        i = 1;
        pdevsta->Relay1 = 1;
        setRelay(RELAY1,RELAY_CLOSE);
        
    }else if((u8)strstr(RXBuffer,"RELAY1_OFF"))
    {
        i = 1;
        pdevsta->Relay1 = 0;
        setRelay(RELAY1,RELAY_OPEN);
    }
    
    if((u8)strstr(RXBuffer,"RELAY2_ON"))
    {
        i = 1;
        pdevsta->Relay2 = 1;
        setRelay(RELAY2,RELAY_CLOSE);
    }else if((u8)strstr(RXBuffer,"RELAY2_OFF"))
    {
        i = 1;
        pdevsta->Relay2 = 0;
        setRelay(RELAY2,RELAY_OPEN);
    }

    if((u8)strstr(RXBuffer,"Light_ON"))
    {
        i = 1;
        pdevsta->Beep = 1;
        setRelay(Light,Light_ON);//蜂鸣器低电平蜂鸣
    }else if((u8)strstr(RXBuffer,"Light_OFF"))
    {
        i = 1;
        pdevsta->Beep = 0;
        setRelay(Light,Light_OFF);//蜂鸣器高电平关闭
        
    }
    
            
    
    
    /*清除接收缓冲并更新继电器状态到服务器*/
    if(i!=0)
    {
		printf("RXBuffer is %s.",RXBuffer);
        memset(RXBuffer,0,RXBUFFER_LEN);
		sendDeviceStatus(pdevsta);
        Delay_ms(200); 
    }   
}
